package main;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import mascotas.Gato;
import mascotas.Mascota;
import model.Persona;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import bifurcacion.Arma;
import bifurcacion.ArmaBuilder;
import bifurcacion.Humano;
import bifurcacion.Orco;
import bifurcacion.TipoArma;

/**
 * Para que funcione tienen que configurar Hibernate!!!!!!!
 * Además, si van a usar MySQL, tienen que cambiar la dependencia (pom.xml)
 * La dependencia del driver para MsSQL no les va a funcionar
 */
public class Main {
	//modificar segun el id que le haya dado a la mascota a modificar.
	private static int ultimoId = 3;
	
	public static void main(String[] args) {
		Session session = abrirSesion();
//		StatelessSession session = abrirSesion();
	    
//	    guardar(session);
	    //no se puede hacer todo junto al comienzo porque no se hizo un commit, 
	    //por eso el update tiene que ir separado
//	    update(session);
//	    cargar(session);
//	    Persona persona = hacerAlgo(session);
		
//		ejemploBifurcacion(session);
		Query query = session.createQuery("FROM Orco where id = 2");
		Orco orco = (Orco) query.uniqueResult();
		System.out.println("se trajo al orco \n----------------------------------------------");
//	    System.out.println("antes de cerrar la sesión: \n"+orco.getArmas());
		
		
	    cerrarSesion(session);
	    orco.setNombre("urukkkk");
	    session = abrirSesion();
	    cerrarSesion(session);
	}

	protected static void ejemploBifurcacion(Session session) {
		Arma hacha = new ArmaBuilder()
							.withNombre("Inferno Axe")
							.withAtaque(9)
							.withDefensa(5)
							.withTipoArma(TipoArma.HACHA)
							.build();
		Arma espada = new ArmaBuilder()
							.withNombre("Divine Sword")
							.withAtaque(7)
							.withDefensa(7)
							.withTipoArma(TipoArma.ESPADA)
							.build();
		Arma lanza = new ArmaBuilder()
							.withNombre("Freezing Spear")
							.withAtaque(10)
							.withDefensa(2)
							.withTipoArma(TipoArma.LANZA)
							.build();
		
		Humano humano = new Humano("Rush");
		humano.agregarArma(espada);
		
		Orco orco = new Orco("Lt. Surge");
		orco.agregarArma(hacha, lanza);
		
		session.save(humano);
		session.save(orco);
	}

	protected static void cerrarSesion(Session session) {
//			StatelessSession session){
		session.getTransaction().commit();
//	    session.flush();
	    session.close();
	}

	protected static Session abrirSesion() {
	//StatelessSession abrirSesion(){
		ServiceRegistry serviceRegistry;
		SessionFactory sessionFactory;
		
		Configuration configuration = new Configuration();
	    configuration.configure();
	    serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
	    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

//	    StatelessSession session = sessionFactory.openStatelessSession();
	    Session session = sessionFactory.openSession();
	    session.getTransaction().begin();
		return session;
	}
	
	protected static Persona hacerAlgo(Session session){
		Query query = session.createQuery("from Persona where nombre = 'guido'");
		System.out.println(query.uniqueResult().getClass());
		return (Persona)query.uniqueResult();
	}
	
	protected static void guardar(Session session){
		Set<Mascota> mascotasGuido = new HashSet<Mascota>();
		Mascota bubu = new Gato("bubu");	mascotasGuido.add(bubu);
		Mascota amir = new Gato("amir");	mascotasGuido.add(amir);
		Persona guido = new Persona(22, "Guido", new Date(), null, null, mascotasGuido);
		List<Persona> conocidos = new ArrayList<Persona>();
		conocidos.add(guido);
		Persona guidito = new Persona(1, "Guidito", new Date(), guido, conocidos, null);
		
		session.save(bubu);
		session.save(amir);
		session.save(guido);
		session.save(guidito);
		
		System.out.println("cambiar la variable ultimoId por: "+(ultimoId=bubu.getId()) );
	}
	
	protected static void update(Session session){
		Gato bubu = new Gato("bubu");
		bubu.setId(ultimoId);
		bubu.setVidas(8);
		session.update(bubu);
//		session.saveOrUpdate(bubu);
	}

	@SuppressWarnings("unchecked")
	protected static void cargar(Session session) {
		Query query = session.createQuery("from Mascota gato where gato.nombre like '%bu'");
		List<Mascota> objetos = query.list();
		for(Mascota objeto : objetos){
			System.out.println(objeto.getNombre());
		}
	}
}
